﻿#include<iostream>
#include<vector>
#include<list>
#include<string>
#include<algorithm>
using namespace std;
using std::cout;
using std::endl;
////string


//int main()
//{
//	cout << sizeof(string) << endl;//28
//	return 0;
//}

//string
// 是一个类模板
//（char数组的）串（顺序表）：字符数组：可以扩容，增删查改
void test_string1()
{
	string s1;//无参构造
	string s2("hello world");//带参构造
	string s3(s2);//拷贝构造
	//部分拷贝：
	string s4(s2, 3, 5);//从第三个开始取5个
	string s5(s2, 3);//从第三个开始拷贝到结束（len==npos,巨长，大于总长度：拷贝到结尾）(有多少拷多少)
	//string s6(s2, 3 , 30); //拷贝到结尾（len:30，大于总长度：拷贝到结尾）
	string s7("hello world", 5);//提取前n个：带参构造+长度
	//用n个x初始化串
	string s8(10, 'x');
	
	




	//支持流插入流提取
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	//cout << s6 << endl;
	cout << s7 << endl;
	cout << s8 << endl;



	cin >> s1;//中英文都可
	cout << s1 << endl;


}

void push_back(const string& s)
{

}


void test_string2()
{
	string s1("hello world");//构造
	string s2="hello world";//隐式类型转换const char* -> string(中间生成临时对象)

	const string& s3 = "hello world";

	//构造
	string s4("hello");
	push_back(s4);
	//隐式类型转换
	push_back("hello");

}



void test_string3()
{
	string s1("hello world");
	cout << s1.size() << endl;//size/length:都是返回长度：没有不同
	//cout << s1.length() << endl;


	//引用返回
	//1，减少拷贝
	// 2，修改返回对象
	//char& operator[](size_t i)
	//{
	//	assert(i < _size);
	//	return _str[i];//在堆上
	//}
	//自带越界检查

	//for (size_t i = 0; i < s1.size(); i++)
	//{
	//	s1[i]++;
	//}

	cout << endl;

	//遍历方式1：（下标+【】）
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout<< s1[i] <<" ";
	}
	s1[0] = 'x';
	cout << endl;

	const string s2("hello world");
	//不能修改❌const
	//s2[0] = 'x';//
}

//迭代器：
void test_string4()
{
	string s1("hello world");
	cout << endl;
	
	// 遍历方式2(所有容器支持)：类域里的 ：：迭代iterater
	// 成员函数（迭代器）：  begin（）:返回开始位置    end（）:结束位置的下一个位置的
	//类似（不一定是）指针的遍历：*it(解引用)
	string::iterator it1 = s1.begin();
	while (it1 != s1.end())//==end（）就结束
	{
		*it1 += 3;

		cout << *it1 << " ";//解引用
		++it1;//往后走
	}
	cout << endl;

	// 遍历方式3(所有容器支持)：范围for
	//底层角度：== 迭代器（编译器编译预处理成类似迭代器的过程）
	//for (auto e : s1)
	//{
	//	cout << e << " ";
	//}
	//cout << endl;

}
void test_string5()
{
	const string s1("hello world");

	//const_iterator
	string::const_iterator it1 = s1.begin();//有const只读不可写改❌
	
	// 普通迭代器/const迭代器
	//iterator begin();//可读可写
	//const _iterator begin() const;//只读：保护迭代器指向的内容不被修改
	//为啥不是 const iterator？
	//const iterator//的意思是迭代器本身不可写


	//auto == string::const_iterator//用auto代替这个类型（const迭代器）
	//auto it1 = s1.begin();
	while (it1 != s1.end())
	{
		//*it1 += 3;
		//不能修改

		cout << *it1 << " ";
		++it1;
	}
	cout << endl;


	//reverse_iterator(倒着遍历)（反向迭代器）
	string s2("hello world");
	//string::reverse_iterator it2 = s2.rbegin();
	auto it2 = s2.rbegin();

	while (it2 != s2.rend())
	{
		//*it2 += 3;
		//可以修改

		cout << *it2 << " ";
		++it2;//不能用--（++才是往左边走（反着来））
	}
	cout << endl;

}

//
void test_string6()
{
	string s1("hello world");
	cout << s1 << endl;
	//对string按字典序排：ascll码排序
	//algorithm算法
	// 左闭右开
	//[ )
	// 
	//sort(s1.begin(), s1.end());//排序
	//sort(++s1.begin(), --s1.end());//不对第一个和最后一个值排序
	
	//前五个排序:开区间：【0-5），实际：【0-4】
	sort(s1.begin(), s1.begin()+5);
	
	cout << s1 << endl;
}

void test_string7()
{
	string s1("hello world");
	cout << s1 << endl;

	s1.push_back('x');
	cout << s1 << endl;

	s1.append("yyyyyy!!");
	cout << s1 << endl;

	string s2("111111");

	s1 += 'y';
	s1 += "zzzzzzz";
	s1 += s2;

	cout << s1 << endl;


}
int main()
{
	//test_string1();
	//test_string2();
	//test_string3();
	//test_string5();
	//test_string6();
	test_string7();
	return 0;
}
































